package suanfajingpinke;

public class Test3 {
    //题目： 力扣面试题 17.19. 消失的两个数字
    //算法： 位运算
    public static void main(String[] args) {

    }
    public int[] missingTwo(int[] nums) {
        //1.先把所有的数异或在一起  包括 1~N的数 和nums里面的数
        int tmp = 0;
        for(int num : nums) {
            tmp = tmp ^ num;
        }
        for(int i = 1; i <= nums.length+2; i++) {
            tmp ^= i;
        }
        //现在tmp中存着的是a^b 的值  我们要把a和b单独拿出来
        //2.找到tmp中比特位为1 的那一位
        int diff = 0;
        while(true) {
            if(((tmp >> diff) &1) == 1) break;
            else diff++;
        }
        //根据一个比特位 是1 还是0 就把a和b 分开了
        //分开再异或
        int[] arr = new int[2];
        for(int i = 1; i <= nums.length +2;i++) {
            if(((i >> diff)& 1) == 1) {
                //直接放进0下标
                arr[0] ^=i;
            }else{
                arr[1] ^=i;
            }
        }

        for(int n : nums) {
            if(((n>>diff)& 1) == 1) {
                arr[0] ^=n;
            }else{
                arr[1] ^=n;
            }
        }
        return arr;
    }
}
